/**
 * 00004 - Easy Pick
 * 
 * 题目描述：
 * 实现 TypeScript 的 Pick<T, K> 工具类型，从类型 T 中选择属性 K 来构造类型。
 * 
 * 例如：
 * interface Todo {
 *   title: string
 *   description: string
 *   completed: boolean
 * }
 * 
 * type TodoPreview = MyPick<Todo, 'title' | 'completed'>
 * 
 * 应该得到：
 * type TodoPreview = {
 *   title: string
 *   completed: boolean
 * }
 */

import type { Equal, Expect } from '@type-challenges/utils'

// ========== 你的解答区域 ==========
// 在这里实现你的 Pick 类型
type MyPick<T, K extends keyof T> = {
  [P in K]: T[P]
}


// ========== 测试用例 ==========

interface Todo {
  title: string
  description: string
  completed: boolean
}

interface Expected1 {
  title: string
}

interface Expected2 {
  title: string
  completed: boolean
}

type cases = [
  // 基本测试
  Expect<Equal<Expected1, MyPick<Todo, 'title'>>>,
  Expect<Equal<Expected2, MyPick<Todo, 'title' | 'completed'>>>,

  // 边界情况测试
  Expect<Equal<{}, MyPick<Todo, never>>>,
  Expect<Equal<Todo, MyPick<Todo, 'title' | 'description' | 'completed'>>>,
]

// 运行测试（如果类型错误，TypeScript 会报错）
type test1 = Expect<Equal<Expected1, MyPick<Todo, 'title'>>>
type test2 = Expect<Equal<Expected2, MyPick<Todo, 'title' | 'completed'>>>

/**
 * 提示：
 * 1. 你需要使用映射类型 (Mapped Types)
 * 2. 使用 keyof 操作符获取对象的所有键
 * 3. 使用 extends 约束 K 必须是 T 的键的子集
 * 4. 使用条件类型来过滤属性
 * 
 * 答案示例：
 * type MyPick<T, K extends keyof T> = {
 *   [P in K]: T[P]
 * }
 */ 